Prevod komunikace s RS232 pomo ci MSCOMM32.OCX na SYNASER

Otázka od: Ing. Jiri Sokol

12. 8. 2004 12:01

Ahoj panove!
Predem podotykam, ze komunikaci po RS232 delam poprve - budte, prosim,
shovivavi. Diky.
Mam predelavat aplikaci, kde je pro komunikaci pouzito reseni objektu TMSComm
(externi knihovna MS MSCOMM32.OCX). Jelikoz jsem byl pozadan, aby komunikace
nebyla zavisla na teto knihovne, rozhodle jsem se pouzit SYNASER.
Mam ale problem s prevodem nekterych f-ci a nastaveni nekterych property.
Byli byste tedy tak moc laskavi a pomohli se zorientovat? Pochopeni SYNASERu
snad az takovy problem neni, ale funguje trochu jinak nez zminene *.ocx a tak
bych chtel chybejici f-ce doplnit, abych nemusel predelavat celou aplikaci.
Takze mam globalni promennou "Com" - vytvarim objekt TMsComm. Pak nastavuju
parametry komunikace:
Com:=TMsComm.Create(nil);
with Comm do
begin
  CommPort := CisloSerPort; //CisloSerPort - smallint - parametr procedury -
vybere uzivatel pri spusteni app
  Settings := '9600,N,8,2';
  InputLen := 5;
  InputMode := 0;
  NullDiscard := false;
end;

To jsem prevedl pod SNASER takto:
Com:=TBlockSerial.Create;
with Comm do
begin
  CommPort := ('COM'+IntToStr(CisloSerPort)); //CisloSerPort - smallint -
parametr procedury - vybere uzivatel pri spusteni app
  Config(9600, 8, 'N', 2, false, false);
// InputLen := 5; <<-- uz nevim co a jak nastavit - tipoval jsem, ze by to
mohlo byt MaxLineLength := 5; - je to spraven???
// InputMode := 0; //typ - TOleEnum <<-- vubec zadny napad co a jak nastavit...
 
// NullDiscard := false; <<-- vubec zadny napad co a jak nastavit...  
end;

WordBoll prop RTSEnabled jsem identifikoval v synaseru jako RTS - spravne?

Pak mam problem s jednou property puvodniho Comm a sice OpenPort. Jeji typ je
boolean a navazuje/ukoncuje spojeni - aspon to tak chapu z toho kodu
Dale pak nevim co dela Refresh (Tohle neni k Objektu TMsComm, ale k TControls a
moc dobre tomu nerozumim... asi jsem zil ve spatne domence, ze tahle procedura
slouzi hlaven pro visulani objekty) a jak na Input (prop OleVariant -
pravdepodobne neco s Bufferem) a Output (prop OleVariant - pravdepodobne neco s
Bufferem) - jak to prevest do Synaseru?

Jsem bezradny, protoze mi chybi jakakoliv dokumentace k te *.ocx. Snad pry
existuje help Comm96.Hlp - to jsem vycetl z te *.ocx, kdyz jsem se na ni
kouknul pres TotalCommandera "F3" - ten jsem ale nikde nenasel.

Muzete mi, prosim, pomoct?
Diky
Jirka
--------------------------------------------------
Ing. Jiri Sokol; jiri.sokol@seznam.cz; 972 231 187
D6Prof+SP3; WinXPProf+SP1; FB 1.5.0
programator amater


Odpovedá: Lukas Gebauer

12. 8. 2004 12:01

> Com:=TMsComm.Create(nil); with Comm do
> begin
> CommPort := CisloSerPort; //CisloSerPort - smallint - parametr
> procedury - vybere uzivatel pri spusteni app Settings :=
> '9600,N,8,2'; InputLen := 5; InputMode := 0; NullDiscard := false;
> end;

V pripade Synaseru, nejprve port musis otevrit pomoci Copnnect, a pak
jej pomoci Config nakonfigurujes (pokud to potrebujes...). Pak uz
muzes hned s portem komunikovat dokud jej zase nezavres.

Config muzes na otevrenem portu volat i nekolikat a tak za behu menit
komunikacni parametry.

Tedy, v tvem pripade:

Com:=TBlockSerial.Create;
try
 com.connect('COM'+IntToStr(CisloSerPort));
 com.Config(9600, 8, 'N', 2, false, true); //to posledni true zapina
RTS rizeni toku
 //nyni uz vesele komunikuj pomoci send* a recv* funkci.
...
finally
 com.free; //uzavreni portu
end;

> // InputLen := 5; <<-- uz nevim co a jak nastavit - tipoval jsem, ze
> by to mohlo byt MaxLineLength := 5; - je to spraven??? // InputMode :=
> 0; //typ - TOleEnum <<-- vubec zadny napad co a jak nastavit...   //
> NullDiscard := false; <<-- vubec zadny napad co a jak nastavit...  

nenastavuj nic, tyto parametry ignoruj...

> WordBoll prop RTSEnabled jsem identifikoval v synaseru jako RTS -
> spravne?

RTS slouzi jen ke cteni stavu signalu RTS. Pokud jde o to, ze chces
mit komunikaci riozeou pomocu RTS/CTS signalu, musis to synaseru rict
v Config metode. viz ten muj priklad.

> Pak mam problem s jednou property puvodniho Comm a sice OpenPort. Jeji
> typ je boolean a navazuje/ukoncuje spojeni - aspon to tak chapu z toho
> kodu

Pokud se chces pripojit k portu, volas metodu Conenct, pokud se chces
odpojit, volas metodu CloseSocket. (pripadne kdyz likvidujes objekt,
zje port automaticky uzavren.)

> domence, ze tahle procedura slouzi hlaven pro visulani objekty) a jak
> na Input (prop OleVariant - pravdepodobne neco s Buf ferem) a Output
> (prop OleVariant - pravdepodobne neco s Bufferem) - jak to prevest do
> Synaseru?

Podivej se na metody, ktere zacinaji na send* a recv*. Nejake
povidani o techtometodach mas jednak na:

http://synapse.ararat.cz/wiki/index.php?page=Article014

A druhak v dokumentaci, ktera je u posledni verze Synaseru pritomna
primo ve zdrojovem kodu.



--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.


Odpovedá: Ing. Jiri Sokol

12. 8. 2004 12:02

> Od: Lukas Gebauer <gebylist@mlp.cz>
> Datum: 12.08.2004 09:40:23
 
> RTS slouzi jen ke cteni stavu signalu RTS. Pokud jde o to, ze chces
> mit komunikaci riozeou pomocu RTS/CTS signalu, musis to synaseru rict
> v Config metode. viz ten muj priklad.

A jak to muzu ovladat? Chapu to dobre, ze mam menit cely konfig? Tzn.:
----------
Pozadavek na "RTS:=false;"
Config (9600, 8, 'N', 2, false, true); //pry se musi pri pokusu nastaveni false
vzdy udelat toto - je to pravda?
Config (9600, 8, 'N', 2, false, false);
---------
Pozadavek na "RTS:=true;"
Config (9600, 8, 'N', 2, false, true);
---------
 
> > Pak mam problem s jednou property puvodniho Comm a sice OpenPort. Jeji
> > typ je boolean a navazuje/ukoncuje spojeni - aspon to tak chapu z toho
> > kodu
>
> Pokud se chces pripojit k portu, volas metodu Conenct, pokud se chces
> odpojit, volas metodu CloseSocket. (pripadne kdyz likvidujes objekt,
> zje port automaticky uzavren.)

Ta promenna (objekt) Comm je globalni. Da se nejak zjistit, jestli jsem k portu
porad pripojen? To by pak slo udelat tu prperty

OpenPort...

/*
Da se na property objektu postavit nejaka f-ce? Tzn. tak, jak to je ted -
bool:=Com.PortOpen zjisti jestli otevren read a pri write

by se zavolala nejaka procedura. Muzete me nakopnout? Jde to urcite... viz
napr.. iBDatabase.Connected. Pri wite true bych volal Connect(Port) a pri write
false budu volat CloseSocket - a je to!
*/

Pokud jde o o ten Connect a CloseSocket - muzu nastavit vsechny parametry,
otevrit spojeni a potom na zadost aplikace ten port

zavrit pres CloseSocket a pri dalsim pozadavku ho otevrit pres Connect(port)
aniz bych musel nastavovat ostatni parametry? Objekt

Com je globalni. Vytvorim ho pri creatu a uvolnuju v ondestroy fromulare. Pujde
to tak? No neni az tak velky problem udelat si nejaky record s parametry a pri
volani Connect(port) je vzdy dosazovat... Co je lepsi?
 
> > domence, ze tahle procedura slouzi hlaven pro visulani objekty) a jak
> > na Input (prop OleVariant - pravdepodobne neco s Buf ferem) a Output
> > (prop OleVariant - pravdepodobne neco s Bufferem) - jak to prevest do
> > Synaseru?
>
> Podivej se na metody, ktere zacinaji na send* a recv*. Nejake
> povidani o techtometodach mas jednak na:
>
> http://synapse.ararat.cz/wiki/index.php?page=Article014
>
> A druhak v dokumentaci, ktera je u posledni verze Synaseru pritomna
> primo ve zdrojovem kodu.

OK, je to anglicky, ale snad to pochopim   Problem je spis v tom, ze nevim co
delaji ty Input a Output v tom MSCOMM32.OCX - k tomu

zadnou dokumentaci nemam...   To je ten problem...
Diky za pomoc!
Jirka
--------------------------------------------------
Ing. Jiri Sokol; jiri.sokol@seznam.cz; 972 231 187
D6Prof+SP3; WinXPProf+SP1; FB 1.5.0
programator amater

Odpovedá: Lukas Gebauer

12. 8. 2004 12:01

> > RTS slouzi jen ke cteni stavu signalu RTS. Pokud jde o to, ze chces
> > mit komunikaci riozeou pomocu RTS/CTS signalu, musis to synaseru
> > rict v Config metode. viz ten muj priklad.
>
> A jak to muzu ovladat? Chapu to dobre, ze mam menit cely konfig? Tzn.:
> ---------- Pozadavek na "RTS:=false;" Config (9600, 8, 'N', 2, false,
> true); //pry se musi pri pokusu nastaveni false vzdy udelat toto - je
> to pravda? Config (9600, 8, 'N', 2, false, false); --------- Pozadavek
> na "RTS:=true;" Config (9600, 8, 'N', 2, false, true); ---------

jde o to, jestli potrebujes RTS ovl;adat rucne, nebo jestli chces
nechat hardware serioveho portu, aby ti ovladal RTS signal sam, aniz
by ses o to musel starat.

Pokud tam nastavit ten hardflow na true, pak se RTS ovlada zcela
samo. Pokud sis ti chces cvicit rucne, pak nastav false, a pouzivej
property RTS jak uznas za vhodne.

> Ta promenna (objekt) Comm je globalni. Da se nejak zjistit, jestli
> jsem k portu porad pripojen? To by pak slo udelat tu prperty

Podivej se na property Device.

> by se zavolala nejaka procedura. Muzete me nakopnout? Jde to urcite...
> viz napr.. iBDatabase.Connected. Pri wite true bych volal
> Connect(Port) a pri write false budu volat CloseSocket - a je to! */

Nejak mi unika, proc z toho musis mit property? Co je za problem
misto prirazeni True do property volat jednu metodu a misto prirazeni
false volat druhou metodu? ;-O

> Pokud jde o o ten Connect a CloseSocket - muzu nastavit vsechny
> parametry, otevrit spojeni a potom na zadost aplikace ten port
>
> zavrit pres CloseSocket a pri dalsim pozadavku ho otevrit pres
> Connect(port) aniz bych musel nastavovat ostatni parametry?

Muzes, ale silne to nedoporucuji! Co kdyz se ti mezi tim zavrenim a
otevrenim nejaka cizi apliakce vecpe na port a prekonfiguruje jej?

Ostatne, co je za problem po otevreni portu zavolat ten jeden jedinny
radek a port si pokazde nakonfigurovat?

> Objekt Com je globalni. Vytvorim ho pri creatu a uvolnuju v >
> ondestroy fromulare. Pujde to tak? No neni az tak velky problem udelat
> si nejaky record s parametry a pri volani Connect(port) je vzdy
> dosazovat... Co je lepsi?

Objekt klidne vytvor s formularem, to problem neni.

Jen nechapu, proc se potrebujes k tomu portu porad pripojovat a
odpojovat...

> OK, je to anglicky, ale snad to pochopim   Problem je spis v tom, ze
> nevim co delaji ty Input a Output v tom MSCOMM32.OCX - k tomu
> zadnou dokumentaci nemam...   To je ten problem...

Ja myslel, ze predelavas nejaky zdrojak... vzdyt v tom programu musi
byt videt co se s temi daty pak v programu deje, takze by nemel byt
problem odhadnout, co ty dve funkce asi delaji, ne?



--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.